整理以及总结一下,回溯下基础。
ECMAScript中具有两种数据类型的值,分别是 基本类型值和引用类型值。
在ECMAScript中,基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象。
基本数据类型
基本数据类型:undefined(未定义的值的默认值) null(尚未存在的对象) boolean(true or false) number(数字) string(字符串)。
基本类型的值不能添加属性。
var str = 'I am basic';
str.type='basic';//it is wrong!!!
这五种数据类型是按值访问的,也就是操作的是保存在变量中实际的值,改变了就是改变了。
引用类型:这种类型就是在操作的时候,操作的是其自身的引用,而不是实际的对象。当然这一块还要再细化一点,当操作动作是复制时,操作的是对象的引用。当操作动作是添加时,操作的是实际的对象。
下面说说一些操作以及开发中的注意点
基本操作
基本类型:就是复制,copy,你会得到两个一模一样的东西,并且这两个之间是相互独立的
var a = 111;
var b = a;
a+=10;
console.log(a);//121
console.log(b);//111
引用类型:引用类型在接受到复制操作这个命令时,也是会把变量对象中的值复制一份放到一个新的空间中。但是,这个值并不是真正的值,而是一个指针或者说是路径,它指向了存储在堆中的一个对象。复制之后的这两个变量只是两个指针,指向同一个地方。
这样的话,改变一个,另一个也得变化。
var a ={};
var b=a;
a.age=18;
console.log(b.age);//18
拷贝操作
所以在日常开发中,经常会用到对象的赋值操作,这里直接用‘=’可能会引起不必要的一些bug,这里一般用一些方法避免掉。
- for循环,键值对应赋值,数据对象都可以,这里要注意一个深浅拷贝,深拷贝要对当前对象的所有的属性进行遍历赋值
深入剖析 JavaScript 的深复制 -
arrB=arrA.slice(0)
js的数组操作方法 slice会返回一个新的数组,接受两个参数(start,end),如果没有传end,默认为从start到数组尾部. -
arrB=arrA.concat()
js的数组操作方法,同样返回一个新数组。 -
var arrA=[1,2,3]; var [...arrB]=arrA; console.log(arrB)//[1,2,3]
这里用上了es6的扩展运算符,原理就是先拆掉再放进数组里。
-
var objB=JSON.parse(JSON.stringify(objA))
拷贝一个字符串(基本类型)会新开辟出一个存储地址,这样就没有之前的引用了。 -
var objA={'name':'11','age':'22'} var {...objB}=objA;
是的,这样也可以的。。。
这样开发中可以根据需要复制的数据来选择相对简单方便的方法。
小结
非常基础的知识点了,但是开发中不注意也会引起不必要的麻烦,同时在日常开发中可以针对不同的需求提前写好工具函数,统一起来。方法多不一定是好事,群魔乱舞。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。